{{ $scr := .Scratch }}
<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  {{ $is_sponsor := site.Params.i_am_a_sponsor | default false }}
  {{ $hide_generator := site.Params.power_ups.hide_generator | default false }}
  {{ if not (and $is_sponsor $hide_generator) }}
    <meta name="generator" content="Wowchemy {{ site.Data.wowchemy.version }} for Hugo" />
  {{ end }}

  {{/* EXTENSIBILITY HOOK: HEAD-START */}}
  {{ partial "wowchemy-core/functions/get_hook" (dict "hook" "head-start" "context" .) }}

  {{/* Parse theme and font */}}
  {{ partial "functions/parse_theme" . }}

  {{/* Pre-connect to Google Fonts if the site's Font Theme uses them. */}}
  {{ with ($scr.Get "google_fonts") }}
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
  {{ end }}

  {{/* Load Google Fonts if the site's Font Theme uses them. */}}
  {{/* Note: we cannot use SRI with Google Fonts because the CSS is dynamically generated according to the user agent. */}}
  {{ with ($scr.Get "google_fonts") }}
    {{ if hasPrefix . "family=" }}
      {{/* If `google_fonts` starts with "family=", use API v2 (https://developers.google.com/fonts/docs/css2) */}}
      <link rel="preload" as="style" {{ printf "href=\"https://fonts.googleapis.com/css2?%s&display=swap\"" . | safeHTMLAttr }}>
      <link rel="stylesheet" {{ printf "href=\"https://fonts.googleapis.com/css2?%s&display=swap\"" . | safeHTMLAttr }} media="print" onload="this.media='all'">
    {{ else }}
      {{ errorf "There is a new version of Google Fonts. Learn how to upgrade your font pack at https://wowchemy.com/docs/customization/#custom-font" }}
    {{ end }}
  {{ end }}

  {{ if site.Params.marketing.analytics.google_optimize | and hugo.IsProduction }}
    <script src="https://www.googleoptimize.com/optimize.js?id={{ site.Params.marketing.analytics.google_optimize }}"></script>
  {{- end -}}

  {{ $css := site.Data.assets.css }}
  {{ $js := site.Data.assets.js }}

  {{/* Config LaTeX math rendering. */}}
  {{ if or .Params.math site.Params.features.math.enable }}
    {{ $mathjax_config := resources.Get "js/mathjax-config.js" }}
    <script src="{{ $mathjax_config.RelPermalink }}"></script>
  {{ end }}

  {{/* Attempt to load local vendor CSS, otherwise load from CDN. */}}

  {{/* Only load non-essential CSS in this media-swapping way */}}
  {{- $stylesheets := slice -}}
  {{- $lib_names := slice "fontawesome/all.min" -}}
  {{- range $lib_names -}}
    {{- $stylesheets = $stylesheets | append (resources.Get (printf "css/libs/%s.css" . ) ) -}}
  {{- end -}}
  {{ $stylesheets = $stylesheets | resources.Concat "css/vendor-bundle.css" | minify }}
  {{- if eq (getenv "WC_POST_CSS") "true" -}}
    {{- $stylesheets = $stylesheets | postCSS -}}
  {{- end -}}
  {{- if hugo.IsProduction -}}
    {{- $stylesheets = $stylesheets | fingerprint "md5" -}}
  {{- end -}}
  {{- if eq (getenv "WC_POST_CSS") "true" -}}
    {{/* PostProcess must be last action in the pipeline */}}
    {{- $stylesheets = $stylesheets | resources.PostProcess -}}
  {{- end -}}
  <link rel="stylesheet" href="{{$stylesheets.RelPermalink}}" media="print" onload="this.media='all'">

  {{ $scr.Set "vendor_css_filename" "main.min.css" }}
  {{ $scr.Set "vendor_js_filename" "main.min.js" }}
  {{ if and (fileExists (printf "static/css/vendor/%s" ($scr.Get "vendor_css_filename"))) (fileExists (printf "static/js/vendor/%s" ($scr.Get "vendor_js_filename"))) }}
    {{ $scr.Set "use_cdn" 0 }}
    <link rel="stylesheet" href="{{ printf "/css/vendor/%s" ($scr.Get "vendor_css_filename") | relURL }}" />
  {{ else }}
    {{ $scr.Set "use_cdn" 1 }}
    {{ if site.Params.extensions.academicons.enable }}
      {{ printf "<link rel=\"stylesheet\" href=\"%s\" integrity=\"%s\" crossorigin=\"anonymous\" media=\"print\" onload=\"this.media='all'\">" (printf $css.academicons.url $css.academicons.version) $css.academicons.sri | safeHTML }}
    {{ end }}

    {{/* Workaround `.HasShortcode "gallery"` not parsing page resources (widget page sections) */}}
    {{ $has_gallery := false }}
    {{/* Note: unless there is a root `/index.md` with `type: widget_page`, Hugo treats homepage as `page` type. */}}
    {{ if (eq .Type "widget_page") | or (and .IsHome (eq .Type "page")) }}
      {{/* Check if widget page sections use a gallery */}}
      {{ $page := "/home/index.md" }}
      {{ $context := cond .IsHome (site.GetPage $page) . }}
      {{ range $context.Resources.ByType "page" }}
        {{ if .HasShortcode "gallery" }}
          {{ $has_gallery = true }}
        {{ end }}
      {{ end }}
    {{ else }}
      {{/* Single page */}}
      {{ if .HasShortcode "gallery" | or ($.Page.Store.Get "has_gallery") }}
        {{ $has_gallery = true }}
      {{ end }}
    {{ end }}
    {{ if (eq .Type "landing") }}
      {{ range $index, $block := .Params.sections }}
        {{ if (gt (len (findRE `\{\{< gallery` $block.content.text 1)) 0) }}
          {{ $.Page.Store.Set "has_gallery" true }}
          {{ $has_gallery = true }}
        {{ end }}
      {{ end }}
    {{ end }}
    {{ if $has_gallery | or site.Params.require_fancybox }}
      {{ printf "<link rel=\"stylesheet\" href=\"%s\" integrity=\"%s\" crossorigin=\"anonymous\" media=\"print\" onload=\"this.media='all'\">" (printf $css.fancybox.url $css.fancybox.version) $css.fancybox.sri | safeHTML }}
    {{ end }}

    {{/* Maps CSS. */}}
    {{ $map_provider := lower site.Params.features.map.provider }}
    {{ if in (slice "mapnik" "mapbox") $map_provider }}
      {{ printf "<link rel=\"stylesheet\" href=\"%s\" integrity=\"%s\" crossorigin=\"anonymous\" media=\"print\" onload=\"this.media='all'\">" (printf $css.leaflet.url $css.leaflet.version) $css.leaflet.sri | safeHTML }}
    {{ end }}

    {{ if eq (lower site.Params.features.search.provider) "algolia" }}
      {{ printf "<link rel=\"stylesheet\" href=\"%s\" integrity=\"%s\" crossorigin=\"anonymous\">" (printf $css.instantsearch.url $css.instantsearch.version) $css.instantsearch.sri | safeHTML }}
    {{ else if eq (lower site.Params.features.search.provider) "docsearch" }}
      <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@docsearch/css@3" />
    {{ end }}

    {{/* Load async scripts. */}}
    {{ range $k, $v := site.Data.assets.js }}
      {{/* TODO: investigate why `where ... "async" true` does not work. */}}
      {{ $load := $v.async }}

      {{/* Only load MathJax if required. */}}
      {{ if (eq $k "mathJax") | and (not (or $.Params.math site.Params.features.math.enable)) }}
        {{ $load = false }}
      {{ end }}

      {{ if $load }}
        {{ printf "<script src=\"%s\" integrity=\"%s\" crossorigin=\"anonymous\" async></script>" (printf $v.url $v.version) $v.sri | safeHTML }}
      {{ end }}
    {{ end }}
  {{ end }}

  {{/* Load WC style */}}
  {{ $license := printf "/*! Wowchemy v%s | https://wowchemy.com/ */\n" site.Data.wowchemy.version }}
  {{ $license := $license | printf "%s/*! Copyright 2016-present George Cushen (https://georgecushen.com/) */\n" }}
  {{ $license := $license | printf "%s/*! License: https://github.com/wowchemy/wowchemy-hugo-themes/blob/main/LICENSE.md */\n" }}
  {{ $css_bundle_head := $license | resources.FromString "css/bundle-head.css" }}
  {{ $css_options := dict "targetPath" "css/wowchemy.css" }}
  {{- if hugo.IsProduction -}}
    {{- $css_options = merge $css_options (dict "outputStyle" "compressed") -}}
  {{- end -}}
  {{ $sass_template := resources.Get "scss/main.scss" }}
  {{ $style := $sass_template | resources.ExecuteAsTemplate "main_parsed.scss" . | toCSS $css_options }}
  {{- if hugo.IsProduction -}}
    {{- $style = $style | minify -}}
  {{- end -}}
  {{ $style := slice $css_bundle_head $style | resources.Concat "css/wowchemy.css" }}
  {{- if eq (getenv "WC_POST_CSS") "true" -}}
    {{- $style = $style | postCSS -}}
  {{- end -}}
  {{- if hugo.IsProduction -}}
    {{- $style = $style | fingerprint "md5" -}}
  {{- end -}}
  {{- if eq (getenv "WC_POST_CSS") "true" -}}
    {{/* PostProcess must be last action in the pipeline */}}
    {{- $style = $style | resources.PostProcess -}}
  {{- end -}}
  <link rel="stylesheet" href="{{ $style.RelPermalink }}" />

  {{/* Load WC community block styles */}}
  {{ $wc_block_styles := resources.Match "scss/blocks/**.scss" }}
  {{ with $wc_block_styles }}
    {{ $wc_block_styles = $wc_block_styles | resources.Concat "css/wowchemy-blocks.scss" | resources.ToCSS }}
    {{- if eq (getenv "WC_POST_CSS") "true" -}}
      {{- $wc_block_styles = $wc_block_styles | postCSS -}}
    {{- end -}}
    {{- if hugo.IsProduction -}}
      {{- $wc_block_styles = $wc_block_styles | minify | fingerprint "md5" -}}
    {{- end -}}
    {{- if eq (getenv "WC_POST_CSS") "true" -}}
      {{/* PostProcess must be last action in the pipeline */}}
      {{- $wc_block_styles = $wc_block_styles | resources.PostProcess -}}
    {{- end -}}
    <link rel="stylesheet" href="{{ $wc_block_styles.RelPermalink }}" />
  {{ end }}

  {{/* Hugo Chroma Syntax Highlighter Initialization */}}
  {{/* TODO: optimize to only include the Chroma CSS themes when the page has code blocks. */}}
  {{ $hl_theme_light := site.Params.features.syntax_highlighter.theme_light | default "github-light" }}
  {{ $hl_theme_dark := site.Params.features.syntax_highlighter.theme_dark | default "dracula" }}
  {{ $hl_theme_light_path := printf "css/libs/chroma/%s.css" $hl_theme_light }}
  {{ $hl_theme_dark_path := printf "css/libs/chroma/%s.css" $hl_theme_dark }}
  {{ if not (fileExists (printf "assets/%s" $hl_theme_light_path)) | or (not (fileExists (printf "assets/%s" $hl_theme_dark_path))) }}
    {{ errorf "Hugo Chroma themes %s.css and %s.css not found in `css/libs/chroma/`. See https://gohugo.io/commands/hugo_gen_chromastyles/" $hl_theme_light $hl_theme_dark }}
  {{ else }}
    {{ $hl_theme_light_css := resources.Get $hl_theme_light_path | minify }}
    {{ $hl_theme_dark_css := resources.Get $hl_theme_dark_path | minify }}
    <link rel="stylesheet" href="{{ $hl_theme_light_css.RelPermalink }}" title="hl-light" media="print" onload="this.media='all'" {{ if ne ($scr.Get "light") true }}disabled{{end}}>
    <link rel="stylesheet" href="{{ $hl_theme_dark_css.RelPermalink }}" title="hl-dark" media="print" onload="this.media='all'" {{ if eq ($scr.Get "light") true }}disabled{{end}}>
  {{ end }}

  {{/* Load SEO module */}}
  {{ partial "wowchemy_seo" . }}

  {{/* Netlify Identity integration. */}}
  {{ $use_cms := templates.Exists "wowchemycms/single.wowchemycms_config.yml" | default (site.Params.extensions.cms.enable | default false) }}
  {{ if .IsHome | and $use_cms }}
    <script src="https://identity.netlify.com/v1/netlify-identity-widget.js"></script>
  {{ end }}

  {{/* RSS Feed */}}
  {{ with .OutputFormats.Get "RSS" }}
    <link rel="alternate" href="{{ .RelPermalink }}" type="application/rss+xml" title="{{ site.Title }}" />
  {{ end }}

  {{ partial "cookie_consent" . }}

  {{ $title := partial "wowchemy-core/functions/get_page_title" . }}
  <title>{{$title}}</title>

  {{/* EXTENSIBILITY HOOK: HEAD-END */}}
  {{/* Deprecated custom_head hook */}}
  {{ if templates.Exists "partials/custom_head.html" }}
    {{ partial "custom_head" . }}
  {{ end }}
  {{ partial "wowchemy-core/functions/get_hook" (dict "hook" "head-end" "context" .) }}
</head>
